import { request } from '../utils/request';

// ==================== Type Definitions ====================

/**
 * Dubbo 概览统计数据
 */
export interface DubboOverviewDTO {
  providerCount: number;      // 提供的服务数量
  consumerCount: number;      // 消费的服务数量
  totalReferences: number;    // 被引用总次数
  hasConfig: boolean;         // 是否有 Dubbo 配置
}

/**
 * Dubbo Provider 服务信息
 */
export interface DubboProviderDTO {
  configId: number;              // 配置ID
  interfaceFqn: string;          // 接口全限定名
  interfaceSimpleName: string;   // 接口简称
  serviceGroup?: string;         // 服务分组
  version?: string;              // 版本号
  implBean?: string;             // 实现Bean名称
  implClass?: string;            // 实现类全限定名
  moduleName?: string;           // 模块名称
  filePath: string;              // 配置文件路径
  lineNumber?: number;           // 行号
  referencedCount: number;       // 被引用次数
}

/**
 * Dubbo Consumer 服务信息
 */
export interface DubboConsumerDTO {
  configId: number;              // 配置ID
  interfaceFqn: string;          // 接口全限定名
  interfaceSimpleName: string;   // 接口简称
  serviceGroup?: string;         // 服务分组
  version?: string;              // 版本号
  timeout?: string;              // 超时配置
  filePath: string;              // 配置文件路径
  lineNumber?: number;           // 行号
  matchStatus: MatchStatus;      // 匹配状态
  provider?: DubboProviderDTO;   // 匹配到的Provider（可选）
}

/**
 * 匹配状态枚举
 */
export enum MatchStatus {
  MATCHED = 'MATCHED',                    // 已匹配
  VERSION_MISMATCH = 'VERSION_MISMATCH',  // 版本不匹配
  NOT_FOUND = 'NOT_FOUND'                 // 未找到
}

/**
 * 消费者单元信息
 */
export interface ConsumerUnit {
  unitId: string;
  unitName: string;
  appId: string;
  appName: string;
  consumerVersion?: string;
}

/**
 * Dubbo 引用详情
 */
export interface DubboReferenceDetailDTO {
  interfaceFqn: string;        // 接口全限定名
  serviceGroup?: string;       // 服务分组
  version?: string;            // 版本号
  consumers: ConsumerUnit[];   // 消费者单元列表
}

/**
 * 提供者单元信息
 */
export interface ProviderUnit {
  unitId: string;
  unitName: string;
  appId: string;
  appName: string;
  providerVersion?: string;
  implBean?: string;
  implClass?: string;
}

/**
 * Dubbo Provider 详情
 */
export interface DubboProviderDetailDTO {
  // Consumer 配置信息
  interfaceFqn: string;
  serviceGroup?: string;
  version?: string;
  timeout?: string;
  filePath: string;
  lineNumber?: number;

  // Provider 信息
  matchStatus: MatchStatus;
  provider?: ProviderUnit;     // 提供者单元信息（可选）
}

// ==================== Request Parameter Types ====================

/**
 * 查询 Provider 列表的参数
 */
export interface GetProvidersParams {
  interfaceName?: string;   // 接口名称（模糊搜索）
  serviceGroup?: string;    // 服务分组
  version?: string;         // 版本号
}

/**
 * 查询 Consumer 列表的参数
 */
export interface GetConsumersParams {
  interfaceName?: string;   // 接口名称（模糊搜索）
  matchStatus?: MatchStatus; // 匹配状态
}

// ==================== API Functions ====================

/**
 * 获取 Dubbo 服务概览统计
 * @param unitId 单元ID
 * @returns Dubbo 概览数据
 */
export const getDubboOverview = async (unitId: string): Promise<DubboOverviewDTO> => {
  const response: any = await request({
    url: `/unit/${unitId}/dubbo/overview`,
    method: 'get'
  });

  if (response.code === 0) {
    return response.data;
  }
  throw new Error(response.msg || response.message || '获取 Dubbo 概览数据失败');
};

/**
 * 获取 Provider 服务列表
 * @param unitId 单元ID
 * @param params 查询参数
 * @returns Provider 列表
 */
export const getDubboProviders = async (
  unitId: string,
  params?: GetProvidersParams
): Promise<DubboProviderDTO[]> => {
  const response: any = await request({
    url: `/unit/${unitId}/dubbo/providers`,
    method: 'get',
    params
  });

  if (response.code === 0) {
    return response.data || [];
  }
  throw new Error(response.msg || response.message || '获取 Provider 列表失败');
};

/**
 * 获取 Consumer 服务列表
 * @param unitId 单元ID
 * @param params 查询参数
 * @returns Consumer 列表
 */
export const getDubboConsumers = async (
  unitId: string,
  params?: GetConsumersParams
): Promise<DubboConsumerDTO[]> => {
  const response: any = await request({
    url: `/unit/${unitId}/dubbo/consumers`,
    method: 'get',
    params
  });

  if (response.code === 0) {
    return response.data || [];
  }
  throw new Error(response.msg || response.message || '获取 Consumer 列表失败');
};

/**
 * 获取引用某个 Provider 的所有 Consumer 列表
 * @param configId Provider 配置ID
 * @returns 引用详情
 */
export const getReferencedBy = async (configId: number): Promise<DubboReferenceDetailDTO> => {
  const response: any = await request({
    url: `/dubbo/provider/${configId}/referenced-by`,
    method: 'get'
  });

  if (response.code === 0) {
    return response.data;
  }
  throw new Error(response.msg || response.message || '获取引用详情失败');
};

/**
 * 获取 Consumer 对应的 Provider 详情
 * @param unitId 单元ID
 * @param configId Consumer 配置ID
 * @returns Provider 详情
 */
export const getProviderDetail = async (
  unitId: string,
  configId: number
): Promise<DubboProviderDetailDTO> => {
  const response: any = await request({
    url: `/unit/${unitId}/dubbo/consumer/${configId}/provider-detail`,
    method: 'get'
  });

  if (response.code === 0) {
    return response.data;
  }
  throw new Error(response.msg || response.message || '获取 Provider 详情失败');
};
